package controller

import (
	"booksPro/dao"
	"booksPro/model"
	"booksPro/utils"
	"fmt"
	"net/http"
	"strconv"
	"text/template"
)

// func GetBooks(w http.ResponseWriter, r *http.Request) {
// 	books, _ := dao.GetBooks()
// 	t := template.Must(template.ParseFiles("views/pages/manager/book_manager.html"))
// 	t.Execute(w, books)
// }

func DeleteBook(w http.ResponseWriter, r *http.Request) {
	fmt.Println("处理deleteBook的请求")
	//获取get请求传来的bookId
	bookId := r.FormValue("bookId")
	fmt.Println("获取bookID=", bookId)
	dao.DeleteBook(bookId)
	GetPageBooks(w, r)
}

// 提交后 根据是否传入id 来判断是add还是update，
func UpdateBook(w http.ResponseWriter, r *http.Request) {
	bookId := r.PostFormValue("bookId")

	title := r.PostFormValue("title")
	price := r.PostFormValue("price")
	sales := r.PostFormValue("sales")
	stock := r.PostFormValue("stock")
	author := r.PostFormValue("author")

	Id, _ := strconv.ParseInt(bookId, 10, 0)
	fPrice, _ := strconv.ParseFloat(price, 64)
	iSales, _ := strconv.ParseInt(sales, 10, 0)
	iStock, _ := strconv.ParseInt(stock, 10, 0)
	book := &model.Book{
		ID:     int(Id),
		Title:  title,
		Author: author,
		Price:  fPrice,
		Sales:  int(iSales),
		Stock:  int(iStock),
	}
	if Id > 0 {
		dao.UpdateBook(book)
	} else {
		dao.AddBook(book)
	}
	GetPageBooks(w, r)
}

// 去往更新的页面，根据 是否传入id 来判断是修改页面还是新增页面，  页面也是根据是否从后台传book值来判断
func ToUpdateBook(w http.ResponseWriter, r *http.Request) {
	bookId := r.FormValue("bookId")
	Id1, _ := strconv.ParseInt(bookId, 10, 0)
	if Id1 > 0 {
		book, _ := dao.GetBookById(bookId)
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		t.Execute(w, book)
	} else {
		t := template.Must(template.ParseFiles("views/pages/manager/book_edit.html"))
		t.Execute(w, "")
	}

}

func GetPageBooks(w http.ResponseWriter, r *http.Request) {
	pageNo := r.FormValue("pageNo")
	if pageNo == "" {
		pageNo = "1"
	}
	fmt.Println("pageNo=", pageNo)
	page, _ := dao.GetPageBooks(pageNo)
	t := template.Must(template.ParseFiles("views/pages/manager/book_manager.html"))
	t.Execute(w, page)
}

func GetBooksByPrice(w http.ResponseWriter, r *http.Request) {
	fmt.Println("进入到  GetBooksByPrice 的处理器中")
	pageNo := r.FormValue("pageNo")
	if pageNo == "" {
		pageNo = "1"
	}
	minPrice := r.FormValue("min")
	maxPrice := r.FormValue("max")
	// fmt.Println("获取到的minprice=" + minPrice + "maxPrice=" + maxPrice)
	var page *model.Page
	if minPrice == "" && maxPrice == "" {
		//带有min和max的请求 和不带的请求 走不同的查询逻辑
		page, _ = dao.GetPageBooks(pageNo)
	} else {
		page, _ = dao.GetPageBooksByPrice(minPrice, maxPrice, pageNo)
		//当带有价格的查询结果 用上一页下一页查询时，无法将max和min传值，这里将这两个值赋值到page的属性中，每个返回到页面的page对象都带有这两个值
		page.MaxPrice = maxPrice
		page.MinPrice = minPrice
	}
	session, flag := dao.IsLogin(r)
	if flag {
		page.IsLogin = true
		page.Username = session.Username
	}
	t := template.Must(template.ParseFiles("views/index.html"))
	t.Execute(w, page)
}

// 在首页点击 加入购物车按钮后 ，通过bookId 将书加入到购物车
func AddBook2Cart(w http.ResponseWriter, r *http.Request) {
	//通过cookie判断是否登录，如果登录 获取到session保存到用户信息
	session, flag := dao.IsLogin(r)
	if flag {
		bookID := r.FormValue("bookId")
		//根据bookID 查询到该书的所有信息
		book, _ := dao.GetBookById(bookID)

		//获取session保存到userID ，用于购物车的处理
		userID := session.UserID
		//通过userID查购物车
		cart, _ := dao.GetCartByUserID(userID)
		fmt.Println(cart)
		if cart != nil {
			fmt.Println("当前用户已经有购物车")
			cartItem, _ := dao.GetCartItemsByCartIDAndBookID(bookID, cart.CartID)
			//判断 购物车里是否已经有该书本的购物项
			if cartItem != nil {
				fmt.Println("购物车中已经有该图书,只需要将当前该图书的购物项的count+1即可")
				cts := cart.CartItems
				for _, v := range cts {
					if cartItem.Book.ID == v.Book.ID {
						//将当前购物项的数量+1
						v.Count = v.Count + 1
						//更新数据库
						v.Amount = v.GetAmount()
						fmt.Println("更改后到价格", v)
						dao.UpdateCartItemCount(v)
					}
				}
			} else {
				fmt.Println("当前购物车没有该书的购物项")
				//绑定购物车id，插入新的购物项
				cartItem := &model.CartItem{
					Book:   book,
					Count:  1,
					CartID: cart.CartID,
				}
				//在内存中  将新创建的购物项加入到cart购物车中
				cart.CartItems = append(cart.CartItems, cartItem)
				dao.AddCartItem(cartItem)
			}
			for _, v := range cart.CartItems {
				fmt.Println(v.Book.Price)
				fmt.Println(v.Count)
			}
			//不论购物车中是否有当前图书对应的购物项， 都需要更新购物车的count和amount
			err := dao.UpateCart(cart)
			if err != nil {
				fmt.Println("更新cart的count和Amount的时候出错")
			}
		} else {
			//当前用户还没有购物车
			//首先 创建购物车的id 因为要绑定购物车和购物项
			cartID := utils.CreateUUID()
			//创建购物项切片，因为第一次创建购物车所有购物项也是第一个因此id和count都用的1
			var cartItems []*model.CartItem
			cartItem1 := &model.CartItem{
				CartItemID: 1,
				Book:       book,
				Count:      1,
				CartID:     cartID,
			}
			cartItems = append(cartItems, cartItem1)
			//创建购物车
			cart := &model.Cart{
				CartID:    cartID,
				CartItems: cartItems,
				UserID:    session.UserID,
			}
			//插入购物车表，购物车表和购物项表绑定
			dao.AddCart(cart)

		}
		w.Write([]byte("您刚刚将【" + book.Title + "】加入到了购物车"))
	} else {
		w.Write([]byte("请先登录！"))
	}

}
